//
//  PathGrid.h
//  IsoCplus
//
//  Created by 周张林 on 15/9/15.
//
//

#ifndef __IsoCplus__PathGrid__
#define __IsoCplus__PathGrid__

#include <vector>
#include <cmath>
#include "PathNode.h"

/// 地图网格数据类
class PathGrid
{
private:
    
    //网格坐标
    int _gridX=0,_gridZ=0;
    
    //寻路类型
    int _type=0;
    
    //寻路的路径代价
    float _straightCost = 1.0f;
    float _diagCost=sqrt(2.0);
    
    //寻路开始和结束点
    PathNode *_startNode ;
    PathNode *_endNode ;
    
    //所有的路点
    std::vector<std::vector<PathNode*>> _nodes;
    
    //可以走的路点
    std::vector<PathNode*> _walkableNodes;
    
public:
    
    /**
     *  初始化
     *  @param gridX 格子x坐标的数量
     *  @param gridZ 格子Y坐标的数量
     */
    bool init(int gridX,int gridZ);
    ~PathGrid();
    
    /**
     *  将所有的格子设置为可用还是不可用
     *
     *  @param value 是否可用
     */
    void setAllWalkable(bool value);
    
    /**
     *  重新设置网格数组的大小
     *
     *  @param gridX
     *  @param gridZ
     */
    void changeSize(int gridX,int gridZ);
    
    /**
     *  获取和walkable相同的所有格子
     *
     *  @param walkable 是否可用
     *
     *  @return 符合条件的格子数组
     */
    const std::vector<PathNode*> &getNodesByWalkable(bool walkable);
    
    /**
     * 初始化link结点，用于寻路
     
     * @param node 
     * @param type 类型1或2
     */
    void initNodeLink(PathNode *node, int type);
    
    /**
     *  判断是否在网格内
     *
     *  @param nodeX 位置x
     *  @param nodeZ 位置z
     *
     *  @return 在网格内返回true,否则返回false
     */
    bool checkInGrid(int nodeX,int nodeZ) const;
    
    /**
     *  获得PathNode
     *
     *  @param nodeX
     *  @param nodeZ
     *
     *  @return 通过网格位置获取路径点
     */
    PathNode* getNode(int nodeX,int nodeZ) const;
    
    /**
     *  设置寻路的开始点
     *
     *  @param nodeX
     *  @param nodeZ
     */
    void setStartNode(int nodeX,int nodeZ);
    
    /**
     *  获取寻路的开始点
     *
     *  @return 寻路开始点
     */
    PathNode* getStartNode() const;
    
    /**
     *  设置寻路的结束点
     *
     *  @param nodeX
     *  @param nodeZ
     */
    void setEndNode(int nodeX,int nodeZ);
    
    /**
     *  获取结束点
     *
     *  @return 获取寻路的终点
     */
    PathNode* getEndNode() const;
    
    /**
     *  设置某一个格子是否可行
     *
     *  @param nodeX 网格坐标x
     *  @param NodeZ 网格坐标z
     *  @param value 是否可行
     */
    void setWalkable(int nodeX,int NodeZ, bool value);
    
    /**
     *  二叉计算
     *
     *  @param type 1或2
     */
    void calculateLinks(int type);
    
    /**
     *  获取寻路的方式
     *
     *  @return 寻路方式
     */
    int getType() const;
    
    /**
     *  网格坐标X
     *
     *  @return 网格坐标 X
     */
    int getGridX() const;
    
    /**
     *  网格坐标z
     *
     *  @return 网格坐标z
     */
    int getGridZ() const;
    
};


#endif /* defined(__IsoCplus__PathGrid__) */
